/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projekt.zaliczeniowy.tkunit.runner.TestOrderStrategy;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import projekt.zaliczeniowy.tkunit.test.Test;

/**
 *
 * @author Tomek
 */
public class LinearStrategy implements Strategy {

    public Iterator<Test> getTestOrder(final List<Test> tests) {

        /**
         * tu można by zrobić prostą metodę szablonową bo w każdej klasie implementującej
         * interfejs strategy piszemy cały iterator od nowa kiedy tak na prawdę kod różni się nie
         * aż tak bardzo
         */
        return new Iterator<Test>() {
            private int currentIndex = -1 ;
            private boolean hasMoreElements = tests != null && tests.size() > 0;
            final private List<Test> testsToMahshall = Collections.unmodifiableList(tests);

            public synchronized boolean hasNext() {
                return hasMoreElements;
            }

            public synchronized Test next() {
                Test test = null;
                if(hasMoreElements){
                    test = testsToMahshall.get(currentIndex);
                    currentIndex++;
                    if(currentIndex >= testsToMahshall.size()){
                        hasMoreElements = false;
                    }
                }else{
                    throw new Error("There is no more test!!! You didn't use the iterator properly");
                }
                return test;
            }

            public synchronized void remove() {
                throw new Error("Don't modify the test list!!!"); //To change body of generated methods, choose Tools | Templates.
            }
        };
    }
}
